C# 上位機(jī)的USB設(shè)備拔插檢測(cè) | 您所在的位置:網(wǎng)站首頁(yè) › apple mobile device未啟動(dòng),端口檢測(cè)異常 › C# 上位機(jī)的USB設(shè)備拔插檢測(cè) |
我們做USB通信時(shí),通信成功后,往往要檢測(cè)USB設(shè)備的拔插狀態(tài),這里就USB拔插進(jìn)行一下說(shuō)明。 參考:https://www.imooc.com/article/17438 先說(shuō)明一下,我這里只是用C#寫上位機(jī)的自定義USB設(shè)備的檢測(cè),是調(diào)用window的DLL來(lái)實(shí)現(xiàn)USB設(shè)備通信的,具體通信過(guò)程說(shuō)明,我會(huì)在后期補(bǔ)上。 要實(shí)現(xiàn)USB插拔檢測(cè),就不得不說(shuō)到WM_DEVICECHANGE 消息了,當(dāng)設(shè)備被插入/拔出的時(shí)候,WINDOWS會(huì)向每個(gè)窗體發(fā)送WM_DEVICECHANGE 消息,而WM_DEVICECHANGE 消息則是由窗口通過(guò)其WindowProc函數(shù)接收此消息。 Winform中WndProc 函數(shù)作用:主要用在攔截并處理系統(tǒng)消息和自定義消息。比如:windows程序會(huì)產(chǎn)生很多消息,比如你單擊鼠標(biāo),移動(dòng)窗口都會(huì)產(chǎn)生消息。這個(gè)函數(shù)就是默認(rèn)的消息處 理函數(shù)。你可以重載這個(gè)函數(shù)來(lái)制定自己的消息處理流程.在Winform程序中,可以重寫WndProc函數(shù),來(lái)捕捉所有發(fā)生的窗口消息。這樣,我們就可以"篡改"傳入的消息,而人為的讓窗口改 變行為。我們用C#實(shí)現(xiàn)檢測(cè)U盤插拔的功能,是用重寫C# WndProc函數(shù)來(lái)做到的。 至于怎么作,我們下面再說(shuō)明,現(xiàn)在我們先來(lái)看一下微軟對(duì)WindowProc函數(shù)的解析。 WindowProc函數(shù)原型: LRESULT CALLBACK WindowProc(HWND hwnd, // handle to window 窗口句柄 UINT uMsg, // WM_DEVICECHANGE WM_DEVICECHANGE標(biāo)識(shí)符 WPARAM wParam, // device-change event 發(fā)生的事件值,不同的值有著不同的意義,下面會(huì)說(shuō)到 LPARAM lParam ); // event-specific data 指向包含特定于事件的數(shù)據(jù)的結(jié)構(gòu)的指針,其格式取決于wParam參數(shù)的值函數(shù)返回值:正確返回TRUE以授予請(qǐng)求,否則返回BROADCAST_QUERY_DENY以拒絕請(qǐng)求。 wParam值的具體含義: 值含義 DBT_CONFIGCHANGECANCELED0x0019 更改當(dāng)前配置(停靠或取消停靠)的請(qǐng)求已被取消。 DBT_CONFIGCHANGED0x0018處 由于停靠或取消停靠,當(dāng)前配置已更改。 DBT_CUSTOMEVENT0x8006 發(fā)生了自定義事件。 DBT_DEVICEARRIVAL為0x8000 已插入設(shè)備或介質(zhì),現(xiàn)已可用。 DBT_DEVICEQUERYREMOVE在0x8001 要求許可刪除設(shè)備或媒體。任何應(yīng)用程序都可以拒絕此請(qǐng)求并取消刪除。 DBT_DEVICEQUERYREMOVEFAILED0x8002 已取消刪除設(shè)備或介質(zhì)的請(qǐng)求。 DBT_DEVICEREMOVECOMPLETE0x8004 已刪除設(shè)備或介質(zhì)。 DBT_DEVICEREMOVEPENDING0x8003 即將移除設(shè)備或介質(zhì)。不能否認(rèn)。 DBT_DEVICETYPESPECIFIC0x8005 發(fā)生了特定于設(shè)備的事件。 DBT_DEVNODES_CHANGED0x0007 已在系統(tǒng)中添加或刪除設(shè)備。 DBT_QUERYCHANGECONFIG0x0017 請(qǐng)求權(quán)限更改當(dāng)前配置(停靠或取消停靠)。 DBT_USERDEFINED為0xFFFF 此消息的含義是用戶定義的。? 看到這里你可能對(duì)怎用WM_DEVICECHANGE 消息實(shí)現(xiàn)USB拔插檢測(cè)有一個(gè)初步了解了,具體怎么實(shí)現(xiàn),下面我用個(gè)例子來(lái)說(shuō)明。 這里我先說(shuō)明一下思路: 1.重寫WndProc 函數(shù)捕捉所有發(fā)生的窗口消息,重寫的主要內(nèi)容為2、3、4; 2.當(dāng)USB拔插時(shí) WM_DEVICECHANGE 消息會(huì)傳遞到?WndProc 函數(shù),也就是uMsg這個(gè)值; 3.第二步是window自動(dòng)完成的,這里我們要做的是讀出wParam的值,根據(jù)這個(gè)值判斷觸發(fā)了什么對(duì)應(yīng)的事件; 4.根據(jù)第三步,判斷出相應(yīng)的作后,我們就可以根據(jù)觸發(fā)的對(duì)應(yīng)事件,編寫執(zhí)行不同的作代碼了; 5.把這個(gè)重寫函數(shù)放在 private void Form1_Load(object sender, EventArgs e) { } 函數(shù)后面,不用用戶去調(diào)用,在你運(yùn)行窗體后,系統(tǒng)會(huì)自動(dòng)調(diào)用的。 重寫WndProc 函數(shù)具體例程代碼如下: /* ======================USB 插拔檢測(cè)=========================== */ protected override void WndProc(ref Message m) { //Console.WriteLine(m.WParam.ToInt32()); //打印程序檢測(cè)到的變化信息 try { //檢測(cè)到USB口發(fā)生了變化,這里USB口變化時(shí)wParam的值是7,表示系統(tǒng)中添加或者刪除了設(shè)備 if (m.WParam.ToInt32() == 7 ) { UsBMethod(0); //檢測(cè)到USB口有變化時(shí)重新連接一次自己要檢測(cè)的設(shè)備,連接不成功則可以判斷設(shè)備已斷開(個(gè)函數(shù)是USB連接函數(shù)) if (flag == 0) //沒(méi)找到設(shè)備處理事件,我這里 flag=0 表示設(shè)備沒(méi)連接成功 { Dispost(); //關(guān)閉設(shè)備,該函數(shù)的作用是關(guān)閉USB設(shè)備的連接 MessageBox.Show(" USB 已斷開!"); } else { //這里可以添加設(shè)備沒(méi)有斷開的處理代碼 } } } catch (Exception ex) { MessageBox.Show(ex.Message); //異常處理函數(shù) } base.WndProc(ref m); //這個(gè)是windos的異常處理,一定要添加,不然會(huì)運(yùn)行不了 }好啦,到這里重寫WndProc 函數(shù)就完成了,注意:要把這個(gè)函數(shù)放在?private void Form1_Load(object sender, EventArgs e) { } 函數(shù)后面就可以了,不用用戶去調(diào)用,打開程序時(shí)系統(tǒng)就會(huì)自動(dòng)后臺(tái)運(yùn)行了。 ?? 本文來(lái)自博客園,作者:白菜沒(méi)我白,轉(zhuǎn)載請(qǐng)注明原文鏈接:https://www.cnblogs.com/xingboy/p/9845381.html |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |